-- 定义 ReLU 激活函数及其导数
local function relu(x)
    return math.max(0, x)
    --return x;
end
local function relu_derivative(x)
    return x > 0 and 1 or 0
    --return 1;
end

-- local function relu(x)
--     return 1 / (1 + math.exp(-x))
-- end

-- local function relu_derivative(x)
--     return x * (1 - x)
-- end

-- 定义 Neuron 对象
local Neuron = {}
Neuron.__index = Neuron

-- 构造函数：创建一个新的神经元
function Neuron:new(input_size, use_activation)
    local neuron = setmetatable({}, self)
    neuron.weights = {}
    neuron.bias = math.random() * 0.2 - 0.1  -- 初始化偏置
    for i = 1, input_size do
        neuron.weights[i] = math.random() * 0.2 - 0.1  -- 初始化权重
    end
    neuron.use_activation = use_activation  -- 是否使用激活函数
    return neuron
end

-- 前向传播：计算神经元的输出
function Neuron:forward(inputs)
    local sum = self.bias
    for i = 1, #inputs do
        sum = sum + inputs[i] * self.weights[i]
    end
    if self.use_activation then
        self.output = relu(sum)  -- 隐藏层使用 ReLU 激活函数
    else
        self.output = sum  -- 输出层不使用激活函数
    end
    return self.output
end

-- 反向传播：更新权重和偏置
function Neuron:backward(inputs, error, learning_rate)
    local grad = self.use_activation and relu_derivative(self.output) or 1  -- 根据是否使用激活函数计算梯度
    
    for i = 1, #inputs do
        self.weights[i] = self.weights[i] + learning_rate * error * grad * inputs[i]
    end
    self.bias = self.bias + learning_rate * error * grad
end

return Neuron;